﻿/*
 * SharpDevelop으로 작성되었습니다.
 * 사용자: 2120
 * 날짜: 2012-09-27
 * 시간: 오전 4:57
 * 
 * 이 템플리트를 변경하려면 [도구->옵션->코드 작성->표준 헤더 편집]을 이용하십시오.
 */
using System;
using System.Drawing;

namespace PicturePicking.Picking
{
	/// <summary>
	/// 실질적으로 Pick을 당할 수 있는 베이스 클래스입니다.
	/// </summary>
	public class PickingNode : IPickedable, IDrawable
	{
		private IDrawable drawable = null;
		
		public Int32 X{
			get;
			set;
		}
		public Int32 Y{
			get;
			set;
		}
		public Int32 Height{
			get;
			set;
		}
		public Int32 Width{
			get;
			set;
		}
		
		/// <summary>
		/// Pick 을 할수있는 노드 객체를 만듭니다.
		/// </summary>
		/// <param name="d">Node가 화면에 표시 될때 보여질 객체를 지정합니다.</param>
		public static PickingNode Create(IDrawable d,int x,int y,int w,int h)
		{
			return new PickingNode(d,x,y,w,h);
		}
		
		/// <summary>
		/// 그려질 객체를 설정합니다.
		/// </summary>
		/// <param name="d">그려질 객체입니다.</param>
		public void Set(IDrawable d)
		{
			drawable = d;
		}
		
		/// <summary>
		/// 그려지는 객체를 가져옵니다.
		/// </summary>
		/// <returns>현재 그려지는 객체입니다.</returns>
		public IDrawable Get()
		{
			return drawable;
		}
		
		/// <summary>
		/// 현재 들어온 좌표에대해 충돌을 했는지에 대해 여부를 검사합니다.
		/// </summary>
		/// <param name="x">좌표 중 X 값입니다.</param>
		/// <param name="y">좌표 중 Y 값입니다.</param>
		/// <returns>true 이면 충돌, false 이면 충돌하지 않은 값입니다.</returns>
		public bool Collide(int x,int y)
		{
			if(drawable == null){
				throw new MemberAccessException();
			}else{
				if(X <= x && x <= X + Width){
					if(Y <= y && y <= Y + Height){
					return true;
					}
				}
				return false;
			}
		}
		
		/// <summary>
		/// 해당 객체를 그리는 명령입니다.
		/// </summary>
		/// <param name="o">Reserve</param>
		public void Draw(Object o)
		{
			drawable.Draw(new Rectangle(X,Y,Width,Height));
		}
		
		protected PickingNode(IDrawable d,int x,int y,int w,int h)
		{
			Set(d);
			X = x;
			Y = y;
			Width = w;
			Height = h;
		}
	}
}
